Product
Socket Now Supports uv.lock Files
Socket now supports uv.lock files to ensure consistent, secure dependency resolution for Python projects and enhance supply chain security.
@marmot/node-validate
Advanced tools
基于 ajv 的装饰器版 node 校验工具。
npm i --save @marmot/node-validate
tsconfig.json 需要开启装饰器特性及元信息。
// tsconfig.json
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
对于复杂的对象参数,使用 class 定义参数对象类型,并使用 Schema 及 Prop 等等装饰器标注每个属性的校验规则。
import {
EnumProp,
Nullable,
NullableProp,
Prop,
Schema,
} from '@marmot/node-validate';
export enum FilterType {
All = 'ALL',
Search = 'SEARCH',
}
@Schema()
export class Req {
// 必填 number 类型参数
@Prop()
pageNumber: number;
// 非必填 number 类型参数
@NullableProp()
pageSize?: number;
// 非必填枚举类型参数
@Nullable()
@EnumProp({ values: Object.values(FilterType) })
type?: FilterType;
// 默认值为 '' 的 string 类型参数
@Prop({ default: '' })
filter: string;
// 参数类型比较复杂时,无法自动推导类型,需要手动指定参数类型
@Prop({ type: ['string', 'number'] })
mixed: string | number;
}
对需要做参数校验的函数,使用 Validate 装饰器对该函数进行标注,并通过 Arg 装饰器标注需要进行校验的函数参数。
import { Arg, MaximumArg, Minimumm, Nullable, Validate } from '@marmot/node-validate';
class Runner {
@Validate()
async run(
// 复杂对象参数,Arg 装饰器搭配[模型定义]章节中申明的 Req 类使用
@Arg() req: Req,
// 基础类型参数,直接使用 Arg 装饰器
@Minimum(10) @MaximumArg({ maximum: 100 }) size: number,
@Nullable() @Arg() type?: string,
// 直接解构等特殊场景,无法自动获取参数名时,可手动指定参数名,便于排查问题
@Arg({ name: 'customName' }) { filter }: Req = {},
// 参数类型比较复杂时,无法自动推导类型,需要手动指定参数类型
@Arg({ type: ['number', 'string'] }) mixed?: string | number,
// 未使用 Arg 装饰器标注的参数不会进行校验
extra?: boolean,
) {
// 函数逻辑
...
}
}
const runner = new Runner();
try {
runner.run({});
} catch (e) {
// 参数校验失败时,抛出异常
}
用于定义复杂对象每个属性的校验规则,与 Schema 装饰器配合使用。
注意:使用 XXXProp 可以看作是同时使用 XXX 装饰器与 Prop 装饰器的 alias。对于需要设置多个条件的函数参数,请务必只使用一次 Prop 装饰器。
// 例如长度小于 10 的非必填函数参数,下列用法 1, 用法 2 以及用法 3 等价,用法 4 和用法 5 是错误的。
@Schema()
class DemoSchema {
// 用法 1
@Nullable()
@MaxLength(10)
@Prop()
param1?: string;
// 用法 2
@MaxLength(10)
@NullableProp()
param2?: string;
// 用法 3
@Nullable()
@MaxLengthProp({ maxLength: 10 })
param3?: string;
// ❌ 用法 4,错误示例
@NullableArg()
@MaxLengthProp({ maxLength: 10 })
param4?: string;
// ❌ 用法 5,错误示例
@Nullable()
@MaxLengthProp({ maxLength: 10 })
@Arg()
param5?: string;
}
装饰器 | 说明 | 装饰器参数类型 | 示例 |
---|---|---|---|
Prop | 标注属性为必填参数 | IPropOptions |
|
Nullable, NullableProp | 标注属性为非必填参数 | 无 |
|
Const, ConstProp |
标注属性为常量参数 | any |
|
Enum, EnumProp |
标注属性取值范围常量列表 | any[] |
|
Maximum, MaximumProp |
标注 number 类型属性最大值(包含最大值) | number |
|
Minimum, MinimumProp |
标注 number 类型属性最小值(包含最小值) | number |
|
ExclusiveMaximum, ExclusiveMaximumProp |
标注 number 类型属性最大值(不包含最大值) | number |
|
ExclusiveMinimum, ExclusiveMinimumProp |
标注 number 类型属性最小值(不包含最小值) | number |
|
MultipleOf, MultipleOfProp |
标注 number 类型属性为某个数的倍数 | number |
|
MaxLength, MaxLengthProp |
标注 string 类型属性的最大长度 | number |
|
MinLength, MinLengthProp |
标注 string 类型属性的最小长度 | number |
|
Pattern, PatternProp |
标注 string 类型的正则规则 | string |
|
Format, FormatProp |
标注 string 类型的预设规则 |
参考 ajv-formats |
|
MaxItems, MaxItemsProp |
标注数组类型的最大元素个数 | number |
|
MinItems, MinItemsProp |
标注数组类型的最小元素个数 | number |
|
ArrayItem, ArrayItemProp |
标注数组类型包含元素的校验类型 | SchemaType, MetadataClass, Array<SchemaType | MetadataClass> |
|
ArrayTuple, ArrayTupleProp |
标注元组类型包含元素的校验类型 | Array<SchemaType, MetadataClass, Array<SchemaType | MetadataClass>> |
|
Trim, TrimProp | 移除 string 类型属性前后的空白字符 | 无 |
|
TrimStart, TrimStartProp | 移除 string 类型属性前面的空白字符 | 无 |
|
TrimEnd, TrimEndProp | 移除 string 类型属性后面的空白字符 | 无 |
|
ToLowerCase, ToLowerCaseProp | 将 string 类型属性转换为小写字母 | 无 |
|
ToUpperCase, ToUpperCaseProp | 将 string 类型属性转换为大写字母 | 无 |
|
用于标注需要进行参数校验的函数参数,与 Validate 装饰器配合使用。
注意:使用 XXXArg 可以看作是同时使用 XXX 装饰器与 Arg 装饰器的 alias。对于需要设置多个条件的函数参数,请务必只使用一次 Arg 装饰器。
// 例如长度小于 10 的非必填函数参数,下列用法 1, 用法 2 以及用法 3 等价,用法 4 和用法 5 是错误的。
class Runner {
@Validate()
async run(
// 用法 1
@Nullable()
@MaxLength(10)
@Arg()
param1?: string,
// 用法 2
@MaxLength(10)
@NullableArg()
param2?: string,
// 用法 3
@Nullable()
@MaxLengthArg({ maxLength: 10 })
param3?: string,
// ❌ 用法 4,错误示例
@NullableArg()
@MaxLengthArg({ maxLength: 10 })
param4?: string,
// ❌ 用法 5,错误示例
@Nullable()
@MaxLengthArg({ maxLength: 10 })
@Arg()
param5?: string,
) {...
}
}
装饰器 | 说明 | 装饰器参数类型 | 示例 |
---|---|---|---|
Arg | 标注函数参数为必填参数 | IArgOptions |
|
Nullable, NullableArg | 标注函数参数为非必填 | 无 |
|
Const, ConstArg |
标注函数参数为常量参数 | any |
|
Enum, EnumArg |
标注函数参数取值范围常量列表 | any[] |
|
Maximum, MaximumArg |
标注 number 类型函数参数最大值(包含最大值) | number |
|
Minimum, MinimumArg |
标注 number 类型函数参数最小值(包含最小值) | number |
|
ExclusiveMaximum, ExclusiveMaximumArg |
标注 number 类型函数参数最大值(不包含最大值) | number |
|
ExclusiveMinimum, ExclusiveMinimumArg |
标注 number 类型函数参数最小值(不包含最小值) | number |
|
MultipleOf, MultipleOfArg |
标注 number 类型函数参数为某个数的倍数 | number |
|
MaxLength, MaxLengthArg |
标注 string 类型函数参数的最大长度 | number |
|
MinLength, MinLengthArg |
标注 string 类型函数参数的最小长度 | number |
|
Pattern, PatternArg |
标注 string 类型函数参数的正则规则 | string |
|
Format, FormatArg |
标注 string 类型函数参数的预设规则 |
参考 ajv-formats |
|
MaxItems, MaxItemsArg |
标注数组类型函数参数的最大元素个数 | number |
|
MinItems, MinItemsArg |
标注数组类型函数参数的最小元素个数 | number |
|
ArrayItem, ArrayItemArg |
标注数组类型函数参数包含元素的校验类型 | SchemaType, MetadataClass, Array<SchemaType | MetadataClass> |
|
ArrayTuple, ArrayTupleArg |
标注元组类型函数参数包含元素的校验类型 | Array<SchemaType, MetadataClass, Array<SchemaType | MetadataClass>> |
|
Trim, TrimArg | 移除 string 类型函数参数前后的空白字符 | 无 |
|
TrimStart, TrimStartArg | 移除 string 类型函数参数前面的空白字符 | 无 |
|
TrimEnd, TrimEndArg | 移除 string 类型函数参数后面的空白字符 | 无 |
|
ToLowerCase, ToLowerCaseArg | 将 string 类型函数参数转换为小写字母 | 无 |
|
ToUpperCase, ToUpperCaseArg | 将 string 类型函数参数转换为大写字母 | 无 |
|
标注需要进行参数校验的函数,与 Arg 装饰器配合使用。
export interface IValidateOptions {
// 当校验失败时,自定义错误处理逻辑,默认逻辑为直接抛出异常
onError?: (error: IValidateError[]) => void;
}
export type SchemaType = 'number' | 'integer' | 'string' | 'boolean' | 'array' | 'object' | 'null' | string;
由 Schema & Prop 装饰器标注的模型 class
interface IPropOptions {
// 参数类型,基础类型可从定义中自动推导,特殊场景可手动指定类型
type?: SchemaType | SchemaType[] | MetadataClass;
// 参数默认值
default?: any;
// 指定校验失败时的错误信息
message?: string;
}
interface IArgOptions {
// 参数名,直接解构等特殊场景,无法自动获取参数名时,可手动指定参数名,便于排查问题
name?: string;
// 参数类型,基础类型可从定义中自动推导,特殊场景可手动指定类型
type?: SchemaType | SchemaType[] | MetadataClass;
// 参数默认值
default?: any;
}
interface IValidateError {
// 校验失败字段
field: string;
// 校验失败原因
message?: string;
}
FAQs
validate core package
The npm package @marmot/node-validate receives a total of 10 weekly downloads. As such, @marmot/node-validate popularity was classified as not popular.
We found that @marmot/node-validate demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 5 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Product
Socket now supports uv.lock files to ensure consistent, secure dependency resolution for Python projects and enhance supply chain security.
Research
Security News
Socket researchers have discovered multiple malicious npm packages targeting Solana private keys, abusing Gmail to exfiltrate the data and drain Solana wallets.
Security News
PEP 770 proposes adding SBOM support to Python packages to improve transparency and catch hidden non-Python dependencies that security tools often miss.